package com.atcumt.Thread.singleton;

/**
 * 双重校验加锁
 *
 * 1.分配内存空间;  2.执行构造方法，实例化对象; 3.把这个对象赋值给这个空间
 * 如果不加volatile 会执行重排序 1 3 2
 */
public class Singleton2 {
    private static volatile Singleton2 singleton2;

    private Singleton2(){}

    public static Singleton2 getInstance() {
        if (singleton2 == null) { // 线程 A B同时看到 singleton 为 null
            synchronized (Singleton2.class) { // 获得锁进行初始化
                if (singleton2 == null) { // 其中一个线程进入该分支，另外一个线程不会进来
                    singleton2 = new Singleton2();
                }
            }
        }
        return singleton2;
    }
}
